#include <stdio.h>
#include <unistd.h>
#include<stdlib.h>

int un_g_val;//未初始化全局数据
int g_val=100;//已初始化全局数据

int main(void)
{
    printf("test:%p\n",main);//验证代码区：函数名表示其地址，函数是代码
    printf("init:%p\n",&g_val);//验证全局区·已初始化全局区
    printf("unint:%p\n",&un_g_val);//验证全局区·未初始化全局区
    
    char*p1=(char*)malloc(16);//动态开辟：开辟的空间在堆上
    char*p2=(char*)malloc(16);//动态开辟：开辟的空间在堆上
    char*p3=(char*)malloc(16);//动态开辟：开辟的空间在堆上
    char*p4=(char*)malloc(16);//动态开辟：开辟的空间在堆上
    printf("heap1:%p\n",p1);//验证堆区：P在堆上，*p是指向开辟的堆上地址空间的指针变量，在main函数(栈)中创建，处于栈上。
    printf("heap2:%p\n",p2);//验证堆区：P在堆上，*p是指向开辟的堆上地址空间的指针变量，在main函数(栈)中创建，处于栈上。
    printf("heap3:%p\n",p3);//验证堆区：P在堆上，*p是指向开辟的堆上地址空间的指针变量，在main函数(栈)中创建，处于栈上。
    printf("heap4:%p\n",p4);//验证堆区：P在堆上，*p是指向开辟的堆上地址空间的指针变量，在main函数(栈)中创建，处于栈上。
   
    
    printf("stack1:%p\n",&p1);
    printf("stack2:%p\n",&p2);
    printf("stack3:%p\n",&p3);
    printf("stack4:%p\n",&p4);
    return 0;

}
